package com.lfz.demo.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lfz.demo.common.enums.LogType;
import com.lfz.demo.common.enums.MenuType;
import com.lfz.demo.common.target.HoneyLogs;
import com.lfz.demo.entity.User;
import com.lfz.demo.service.UserService;
import com.lfz.demo.utils.RedisUtil;
import com.lfz.demo.vo.DataView;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @author lfz
 * @date 2025/3/24 11:24
 * 在后端添加跨域支持。可以在 LoginController.java 类上添加 @CrossOrigin 注解
 */

@RestController
@RequestMapping("/register")
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class RegisterController {
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);
    // 缓存时间常量（单位：分钟）
    private static final String CACHE_PREFIX = "userMenu:"; //缓存键前缀，避免键冲突。

    @Autowired
    private UserService userService;
    @Autowired
    private RedisUtil redisUtil;

    /**
     * 注册用户
     */
    @PostMapping
    @HoneyLogs(operation = "注册", type = LogType.REGISTER, menu = MenuType.UnFind)
    public DataView register(@RequestBody User user) { // 接收JSON数据
        System.out.println("接收到的用户数据：" + user); // 打印调试

        DataView dataView = new DataView();

        // 1. 校验必填字段（示例）
        if (StringUtils.isBlank(user.getUsername())) {
            dataView.setCode(100);
            dataView.setMsg("用户名不能为空！");
        }

        // 2. 唯一性校验
        if (userService.count(new QueryWrapper<User>().eq("username", user.getUsername())) > 0) {
            dataView.setCode(100);
            dataView.setMsg("用户名已存在！");
        }

        // 3. 保存用户（包含头像路径）
        try {
            boolean save = userService.save(user);
            if (save) {
                // 清理用户相关redis缓存，确保数据同步
                clearRelatedCaches();
                // 设置状态码，提示信息
                dataView.setCode(200);
                dataView.setMsg("注册成功！");
                // 3.1、注册成功后，默认分配权限为普通用户
                userService.AssignPermissionsByLoadUserIdDescOne();
            } else {
                dataView.setCode(100);
                dataView.setMsg("注册失败，请检查输入数据或联系管理员！");
            }
        } catch (Exception e) {
            /*// 捕获异常，记录日志，并返回错误信息
            dataView.setCode(100);
            dataView.setMsg("注册失败，发生未知错误！");*/
            // 可以使用日志框架记录详细的错误信息
            e.printStackTrace();
        }

        // 4. 返回结果
        return dataView;
    }

    /**
     * 清理相关缓存
     */
    private void clearRelatedCaches(){
        try {
            redisUtil.deletePattern(CACHE_PREFIX + "*");
            logger.info("成功清理用户相关缓存");
        }catch (Exception e){
            e.printStackTrace();
            logger.error("缓存清理失败", e);
        }
    }

}
